`
https://leetcode.cn/problems/flatten-nested-list-iterator/
`

/**
 * // This is the interface that allows for creating nested lists.
 * // You should not implement it, or speculate about its implementation
 * function NestedInteger() {
 *
 *     Return true if this NestedInteger holds a single integer, rather than a nested list.
 *     @return {boolean}
 *     this.isInteger = function() {
 *         ...
 *     };
 *
 *     Return the single integer that this NestedInteger holds, if it holds a single integer
 *     Return null if this NestedInteger holds a nested list
 *     @return {integer}
 *     this.getInteger = function() {
 *         ...
 *     };
 *
 *     Return the nested list that this NestedInteger holds, if it holds a nested list
 *     Return null if this NestedInteger holds a single integer
 *     @return {NestedInteger[]}
 *     this.getList = function() {
 *         ...
 *     };
 * };
 */
/**
 * @constructor
 * @param {NestedInteger[]} nestedList
 */
var NestedIterator = function (nestedList) {
  // 将 nestedList 看成一个虚拟根节点的子节点集
  // 即可将结构抽象为一颗多叉树
  // 对这颗多叉树进行一次前序遍历，返回的结果就是题目的要求
  const result = []

  const traverse = (root) => {
    if (root.isInteger()) {
      result.push(root.getInteger())
      return
    }

    for (const child of root.getList()) {
      traverse(child)
    }
  }

  for (const node of nestedList) {
    traverse(node)
  }

  this.result = result
  this.index = 0
};


/**
* @this NestedIterator
* @returns {boolean}
*/
NestedIterator.prototype.hasNext = function () {
  return this.index < this.result.length
};

/**
* @this NestedIterator
* @returns {integer}
*/
NestedIterator.prototype.next = function () {
  return this.result[this.index++]
};

/**
* Your NestedIterator will be called like this:
* var i = new NestedIterator(nestedList), a = [];
* while (i.hasNext()) a.push(i.next());
*/